package Day18.Prop;

/**
 * @version 1.0
 * @BelongsProject:IntelliJ IDEA
 * @BelongsPackage:Day18.Prop
 * @Author:hyhWTX
 * @ClassName:Demo01Properties
 * @CreateTime:2022年-09月-18日 19:06
 * @Description: TODO (一句话描述以下该类的功能)
 */

import java.io.*;
import java.util.Properties;
import java.util.Set;

/**
 *java.util.Properties集合extends Hashtable<k, v> implements Map<k, v>
 *Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。
 * Properties集合是一个唯一和IO流相结合的集合
 *      可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
 *      可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用
 *
 *  属性列表中每个键及其对应值都是一个字符串。
 *      Properties集合是一个双列集合, key和value黑i认都是字符串
 */

public class Demo01Properties {
    public static void main(String[] args) throws IOException {
//        show01();
//        show02();
        show03();
    }




    /**
 *使用Properties集合存储数据,遍历职出Properties底合中的数据
 * Properties集合是一个双列集合,key和uvaLue都是默认字符串
 * Properties集合有一些择作字行串的特有方法
 *      Object setProperty(String key, String value) 调用Hashtable 的方法 put 。
 *      String getProperty(String key)通过key找到value值,此方法相当于Map集合中的get(key)方法
 *      Set<String> stringPropertyNames()返回此属性列表中的键集，其中该键及其对应值是字符串,此方法相当于Mop集合中的keySet方法
 *
 */

    private static void show01() {
        //创建Properties集合对象
        Properties prop = new Properties();
        //使用setProperties往集合里面添加数据
        prop.setProperty("赵丽颖","168");
        prop.setProperty("古力娜扎","165");
        prop.setProperty("迪丽热巴","165");
        prop.setProperty("马儿扎哈","160");

        //使用StringPropertyNames()，把Properties集合中的键取出，存储到一个set集合当中
        Set<String> set = prop.stringPropertyNames();
        //便利set集合，取出Properties集合中的每一个键
        for (String s : set) {
            //使用getProperty方法通过key获取value
            String value = prop.getProperty(s);
            System.out.println(s+"="+value);
        }

    }


    /**
     *可以使用Properties集合中的方法store ,把集合中的临时数据,持久化写入到硕盘中存储
     * void store (outputStream out, String comments)
     * void store( writer writer, String comments)
     * 参数:
     *      OutputStream out:字节输出流,不能写入中文
     *      Writer writer:字行渝出流,可以写中文
     *      String comments:注释,用来解释说明保存的文件是用来干什么用的
     *          不能使用中文，会产生乱码，默认是Unicode编码
     *          一般使用空字符串
     *
     *        使用步骤;
     *              1.创建Properties失合对象,添加数据
     *              2.创建字节输出流/字符输出流对象,构造方法中绑定费输出的目的地
     *              3.使用Properties读合中的方法store,把集合中的自时数据,持久化写入到硬盘中存储
     *              4.释加资源
     */

    private static void show02() throws IOException {
        //创建Properties集合对象
        Properties prop = new Properties();
        prop.setProperty("赵丽颖","168");
        prop.setProperty("古力娜扎","165");
        prop.setProperty("迪丽热巴","165");
        prop.setProperty("马儿扎哈","160");
//        //2.创建字节输出流/字符输出流对象,构造方法中绑定费输出的目的地
//        FileWriter fw = new FileWriter("D:\\java黑马\\src\\Day18\\Prop\\prop.txt");
//
//        //3.使用Properties读合中的方法store,把集合中的自时数据,持久化写入到硬盘中存储
//        prop.store(fw,"save data");
//        //4.释加资源
//        fw.close();

        //匿名对象使用完自己关闭
        prop.store(new FileOutputStream("D:\\\\java黑马\\\\src\\\\Day18\\\\Prop\\\\prop2.txt"),"");
    }


    /**
     *可以使用Properties集合中的方法load ,把硬盘中保存的文件(键值对),读取到集合中使用
     * void load ( InputStream inStream)
     * void load ( Reader reader )
     * 参数:
     *      InputStream InStream:字节输入流,不能读叹合有中文的键怕对
     *      Reader reader :字行输入流,能读收含有中文的读怕对
     * 使用步骏:
     *      1.创建Properties集合对象
     *      2.使用Properties集合对象中的方法load读取保存键值对的文件
     *      3.追历Properties集合
     * 注意:
     *      1.存储键值对的文件中,键与怕男认的连接符号可以使用,空格(其他符号)
     *      2,存储辑值对的文件中,可以使用#进行注释,襆注释的键值对不会再被读取
     *      3.存储徙值对的I文件中,键与值果ki认都是字行串,不用再加引引
     */

    private static void show03() throws IOException {
        //1.创建Properties集合对象
        Properties prop = new Properties();
        //2.使用Properties集合对象中的方法load读取保存键值对的文件
        //字符流
        //prop.load(new FileReader("D:\\\\java黑马\\\\src\\\\Day18\\\\Prop\\\\prop.txt"));
        //字节流
        prop.load(new FileInputStream("D:\\\\java黑马\\\\src\\\\Day18\\\\Prop\\\\prop.txt"));

        //3.追历Properties集合
        Set<String> set = prop.stringPropertyNames();
        for (String s : set) {
            String value = prop.getProperty(s);
            System.out.println(s+"="+value);
        }
    }
}
